const { Gio, GLib, Meta, Shell } = imports.gi;
+const Config = imports.misc.config;
const Main = imports.ui.main;
const Params = imports.misc.params;
+const Util = imports.misc.util;
const { loadInterfaceXML } = imports.misc.fileUtils;
return _perfHelper;
}
+function _spawnPerfHelper() {
+ let path = Config.LIBEXECDIR;
+ let command = `${path}/gnome-shell-perf-helper`;
+ Util.trySpawnCommandLine(command);
+}
+
function _callRemote(obj, method, ...args) {
return new Promise((resolve, reject) => {
args.push((result, excp) => {
}
}
+async function _runPerfScript(scriptModule, outputFile) {
+ for (let step of scriptModule.run()) {
+ try {
+ await step; // eslint-disable-line no-await-in-loop
+ } catch (err) {
+ log(`Script failed: ${err}\n${err.stack}`);
+ Meta.exit(Meta.ExitCode.ERROR);
+ }
+ }
+
+ try {
+ _collect(scriptModule, outputFile);
+ } catch (err) {
+ log(`Script failed: ${err}\n${err.stack}`);
+ Meta.exit(Meta.ExitCode.ERROR);
+ }
+ Meta.exit(Meta.ExitCode.SUCCESS);
+}
+
/**
* runPerfScript
* @param {Object} scriptModule: module object with run and finish
* After running the script and collecting statistics from the
* event log, GNOME Shell will exit.
**/
-async function runPerfScript(scriptModule, outputFile) {
+function runPerfScript(scriptModule, outputFile) {
Shell.PerfLog.get_default().set_enabled(true);
+ _spawnPerfHelper();
- for (let step of scriptModule.run()) {
- try {
- await step; // eslint-disable-line no-await-in-loop
- } catch (err) {
- log(`Script failed: ${err}\n${err.stack}`);
- Meta.exit(Meta.ExitCode.ERROR);
- }
- }
-
- try {
- _collect(scriptModule, outputFile);
- } catch (err) {
- log(`Script failed: ${err}\n${err.stack}`);
- Meta.exit(Meta.ExitCode.ERROR);
- }
- Meta.exit(Meta.ExitCode.SUCCESS);
+ Gio.bus_watch_name(Gio.BusType.SESSION,
+ 'org.gnome.Shell.PerfHelper',
+ Gio.BusNameWatcherFlags.NONE,
+ () => _runPerfScript(scriptModule, outputFile),
+ null);
}
print("GNOME Shell Performance Test @VERSION@")
sys.exit()
-def wait_for_dbus_name(wait_name):
- loop = GLib.MainLoop()
-
- def on_name_appeared(connection, name, new_owner, *args):
- if not (name == wait_name and new_owner != ''):
- return
- loop.quit()
- return
-
- watch_id = Gio.bus_watch_name(Gio.BusType.SESSION,
- wait_name,
- Gio.BusNameWatcherFlags.NONE,
- on_name_appeared,
- None)
-
- def on_timeout():
- print("\nFailed to start %s: timed out" % (wait_name,))
- sys.exit(1)
- GLib.timeout_add_seconds(7, on_timeout)
-
- loop.run()
- Gio.bus_unwatch_name(watch_id)
-
-PERF_HELPER_NAME = "org.gnome.Shell.PerfHelper"
-PERF_HELPER_IFACE = "org.gnome.Shell.PerfHelper"
-PERF_HELPER_PATH = "/org/gnome/Shell/PerfHelper"
-
-def start_perf_helper():
- self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
- perf_helper_path = "@libexecdir@/gnome-shell-perf-helper"
-
- subprocess.Popen([perf_helper_path])
- wait_for_dbus_name (PERF_HELPER_NAME)
-
-def stop_perf_helper():
- bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
-
- proxy = Gio.DBusProxy.new_sync(bus,
- Gio.DBusProxyFlags.NONE,
- None,
- PERF_HELPER_NAME,
- PERF_HELPER_PATH,
- PERF_HELPER_IFACE,
- None)
- proxy.Exit()
-
def start_shell(perf_output=None):
# Set up environment
env = dict(os.environ)
logs = []
metric_summaries = {}
- start_perf_helper()
-
for i in range(0, iters):
# We create an empty temporary file that the shell will overwrite
# with the contents.
try:
normal_exit = run_shell(perf_output=output_file)
except:
- stop_perf_helper()
raise
finally:
if not normal_exit:
os.remove(output_file)
if not normal_exit:
- stop_perf_helper()
return False
try:
output = json.load(f)
f.close()
except:
- stop_perf_helper()
raise
finally:
os.remove(output_file)
logs.append(output['log'])
- stop_perf_helper()
-
if options.perf_output or options.perf_upload:
# Write a complete report, formatted as JSON. The Javascript/C code that
# generates the individual reports we are summarizing here is very careful